package com.kaifamiao.interfaces;

import java.time.LocalDateTime;
import java.util.logging.Logger;

/**
 * 1、从 Java 8 开始允许在接口中定义 default 修饰的非抽象的实例方法
 * 2、从 Java 8 开始允许在接口中定义 static 修饰的非抽象方法(默认修饰符是public)
 * 3、从 Java 9 开始允许在接口中定义 私有的(private) 的 static 方法(非抽象方法)
 */
public interface Moveable {

    // 常量 ( 默认的修饰符是: public static final )
    Logger LOGGER = Logger.getAnonymousLogger();

    // 抽象方法 ( 默认的修饰符是: public abstract )
    void move();

    // Java 8 开始允许在接口中定义 默认方法
    // 被 default 修饰的方法在国内的资料上称作 默认方法
    // 被 default 修饰的方法默认都是 public 修饰的 实例方法
    default void hello(){
        LOGGER.info( "你好" );
    }

    // Java 8 开始允许在接口中定义 类方法 (即被static修饰的方法)
    // 若未显式指定 接口中 static方法 的 访问修饰符，则默认是 public
    static void welcome(){
        LOGGER.info( "若是好友来了，我们会好酒好肉招待" );
        LOGGER.info( "若是那豺狼来了，等待它的有猎枪" );
    }

    // 注意从 Java 8 开始允许在 接口中定义 main 方法
    // 这里的 main 默认是 public 所修饰的，因此这里省略了 public
    static void main(String[] args) {
        //  通过 "接口名.方法名([参数])" 形式调用 接口中的 static方法
        Moveable.welcome();
        // 调用本接口中定义的私有的类方法
        Moveable.showTime();
    }

    // Java 9 才开始允许在接口中定义 私有的 static 方法
    private static void showTime(){
        LOGGER.info( LocalDateTime.now().toString() );
    }

}
